package cn.xiaomubiao.oschine.util;

import android.content.Context;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import static cn.xiaomubiao.oschine.MyApplication.cacheUtils;


/**
 * -/////
 */

/**
 * 网络请求的工具类 -- 返回bean对象数据
 *
 * @author 张伟斌
 */

public class HttpUtil<T> {

    OkHttpClient okHttpClient = new OkHttpClient(); //OkHttpClient对象

    private Context mContext; //上下文 (待用于缓存使用
    private Class<T> clzz;

    // 构造方法
    public HttpUtil(Context mContext, Class<T> clzz) {
        this.mContext = mContext;
        this.clzz = clzz;

    }

    // 请求数据的接口
    public interface OnGetDataListener<T> {

        void onSuccess(T t); //成功
        
        void onFailure(Exception e); //失败

    }

    /**
     * 请求网络的方法 参数
     * 1 请求url路径
     * 2 回调接口对象
     */

    public void getStringData(final String url, final OnGetDataListener<T> listen) {
        // 获取url的md5值 缓存的键
        String key = Md5Utils.string2Md5(url);
        // 通过键获取缓存数据的值
        String value = cacheUtils.getCacheData(key);

        // 进行值的判断
        if (value == null) {
            // 如果为空,则说明没有进行缓存过,则需要进行网络数据的请求
            // 构建请求对象,传入url
            loadDataFromNet(url, listen);

        } else {
            // 有数据,则直接将数据进行bean的解析并返回
            T t = parseXml2Bean(value);

            // 回调
            if (listen != null) {
                listen.onSuccess(t);
            }

        }

    }

    private void loadDataFromNet(final String url, final OnGetDataListener<T> listen) {
        Request req = new Request.Builder()
                .url(url)
                .build();
        /**
         * 通过onkttp对象进行异步请求
         * 调用newCall,传入请求对象,
         * 然后调用enqueue方法,传入一个回调接口对象
         */
        okHttpClient.newCall(req).enqueue(new Callback() {

            // 请求成功
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                // 获取响应体内容
                String result = response.body().string();

                // 获取url的md5值作为缓存的键
                String key = Md5Utils.string2Md5(url);
                // 将获取到的数据进行缓存
                cacheUtils.setCacheData(key, result);

                // 对数据进行解析为bean
                T t = parseXml2Bean(result);

                // 回调
                if (listen != null) {
                    listen.onSuccess(t);

                }

            }

            // 请求失败
            @Override
            public void onFailure(Call call, IOException e) {
                // 回调
                if (listen != null) {
                    listen.onFailure(e);

                }

            }

        });
    }

    // 解析xml数据为bean对象
    private T parseXml2Bean(String str) {
        // 调用工具类进行解析
        T t = XmlUtils.toBean(clzz, str);
        return t;

    }

}